<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>姓名案例2</title>
    <script src="../js/vue.js"></script>
</head>

<body>
    <div id="root">
        <div>
            姓:<input type="text" v-model="firstName"> <br>
            名:<input type="text" v-model="lastName"> <br>
            <!-- 计算属性直接使用插值语法进行使用 -->
            全名:<span>{{fullName}}</span>
        </div>
    </div>
    <script>
        //程序功能  双向绑定姓名输出  
        //但是如果需求增加，需要姓名翻转大写，再截取等此时插值语法中会过于复杂

        /*计算属性：
        1.定义：要用的属性不存在，通过已有属性计算得来
        2.原理: 底层借助了Object.defineProperty方法提供的setter和getter
        3.get函数什么时候执行
            (1)初次读取时执行一次
            (2)当依赖数据发生改变时会再次调用一次
        4.优势：于methods相比，内部有缓存机制，效率更高，调试方便
        5.备注：
            计算属性最终会出现在vm上，直接读取使用即可
            如果计算属性要修改，那么必须写set函数去修改，且set中要引起计算时所依赖的数据发生改变
        */

        Vue.config.productionTip = false
        var vm = new Vue({
            el: '#root',
            data: {
                firstName: 'yu',
                lastName: 'xiaoyao'
            },
            methods: {
            },
            computed: {
                //计算属性里写入对象，
                fullName: {
                    get() {
                        //get的作用  当有人读取fullname时，get被调用，返回值作为fullname的值
                        //vue已经把get中的this维护成了vm，方便我们开发使用

                        // 注:get在什么时候调用很讲究
                        // 1.在初次获取fullname时  模板 首次 多次重复调用 fullname则是在缓存中读出
                        // 2.fullname所依赖的数据发生改变时   这是为了使fullname的值最新
                        // 这个特点在methods中则没有缓存，有几次就调用几次，所以计算属性有时候性能更好
                        console.log(this);
                        return this.firstName + '-' + this.lastName
                    },//需要特别注意计算属性里的get在插值语法时是不需要()调用的，这和data  methods配置项有所区别
                    set(value) {//只在fullname被修改时进行调用
                        const arr = value.split('-');
                        this.firstName = arr[0];
                        this.lastName = arr[1];
                    }
                }
            }
        });
    </script>
</body>

</html>